﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using ICSharpCode.TextEditor.Document;

namespace Läxomatic
{
    public partial class addComment : Form
    {
        private string _submitId;
        private string _fileId;
        private string _selectedIndexText;
        private string _startRowIndex;
        private string _endRowIndex;
        private bool _onRow;
        int _index;
        private List<string> _arrItemToolTips = new List<string>();
        private List<string> _fileIds = new List<string>();
        private string lastTip = "";

        //konstruktor för då ma nska kommentera en fil/uppgift. Sätter relevanta värden och startar Onload();
        public addComment(string submitId, int index)
        {
            InitializeComponent();
            _index = index;
            _submitId = submitId;
            _onRow = false;
            _selectedIndexText = "";
            groupBox1.Enabled = false;
            onLoad();
        }
        //konstruktor för då ma nska kommentera en rad, sätter relevanta värden rätt, och startar onload(); sätter _fileId två gånger eftersom den ändras av listboxen under initiering.
        public addComment(string submitId, string fileId, string selectedIndexText, int startRow, int endRow)
        {
            //För specifik rad..
            InitializeComponent();
            _submitId = submitId;
            _fileId = fileId;
            _selectedIndexText = selectedIndexText;
            _startRowIndex = Convert.ToString(startRow);
            _endRowIndex = Convert.ToString(endRow);
            _onRow = true;
            onLoad();
            setTaskInfo();
            _fileId = fileId;
        }
        //onload, den gemensamma initieringen, sätter radiobutton som  är relevant till checked, uppdaterar ifall man ksa se en listbox, eller labels i en panel (uppgift/fil vs rad), fyller listboxen och startar text editorn, sätter markerad rad i listboxen, och sätter två tooltips.
        private void onLoad()
        {
            if (_onRow)
            {
                rbtn_Row.Checked = true;
                rbtn_fileOrTask.Checked = false;
            }
            else
            {
                rbtn_Row.Checked = false;
                rbtn_fileOrTask.Checked = true;
            }
            UpdateVisible();
            FillListBox();
            InitializeTextEditor();
            lbox_selection.SelectedIndex = _index+1;
            List<string> info = new Tabell<string>(Myskul.Command("SELECT u.fName,u.lName,c.name FROM submit AS su JOIN student AS s ON (su.studentId=s.id) JOIN user AS u ON (u.id=s.userId) JOIN task AS t ON (t.id=su.taskId) JOIN course AS c ON (c.id=t.courseId) WHERE su.id ='"+ _submitId +"';")).getRow(0);
            TruncateAdd truncate = new TruncateAdd(lblToolTip);
            truncate.addTextAndToolTip(lbl_course,info[2],17);
            truncate.addTextAndToolTip(lbl_student,info[0] + " " + info[1],17);
            
        }
        // det som sker då man klickar skicka, letar först upp teacherId, sen hämtar relevanta värden beroende på om man ska lägga en kommentar på en fil, uppgift, elelr rad, för att sedan inserta det i databasen.
        private void btn_send_Click(object sender, EventArgs e)
        {
            string teacherId = new Tabell<string>(Myskul.Command("SELECT t.id from teacher AS t JOIN user_course uc ON (uc.userId = t.userId) JOIN task ta ON (uc.courseId = ta.courseId) JOIN submit s ON(s.taskId = ta.id) WHERE s.id ='"+_submitId+"';"))[0, 0];
            if (rbtn_Row.Checked)
            {
                //Kommentera specifik rad
                Myskul.Command("INSERT INTO comment_row (fileId, startrow,endrow,comment,teacherId) VALUES ("+ _fileId +", " + _startRowIndex + ", " + _endRowIndex + ", '" + Myskul.checkIntrusion(TextEditor.Text) +"', " +teacherId+ ");");


            }
            else
                if (lbox_selection.SelectedIndex == 0)
                {
                    //Kommentera hela uppgiften
                    TimeSpan ts = (DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0));
                    double unixTime = ts.TotalSeconds;

                    List<string> userData = new Tabell<string>(Myskul.Command("SELECT u.id, u.fName, u.lName FROM user u JOIN teacher t ON (t.userId=u.id) WHERE t.id='" + teacherId + "';")).getRow(0);
                    Myskul.Command("INSERT INTO `comment_submit`(`name`, `text`, `time`, `submitId`, `authorId`) VALUES ('" + userData[1] + " " + userData[2] + "','" + Myskul.checkIntrusion(TextEditor.Text) + "'," + Convert.ToString(unixTime) + ",'" + _submitId + "','" + userData[0] + "');");

                }
                else
                {
                    //kommentera ett specifikt dokument
                    Myskul.Command("INSERT INTO comment_file (fileId, comment, teacherId) VALUES ('" + _fileId + "','" + Myskul.checkIntrusion(TextEditor.Text) + "', " + teacherId + ");");
                }
            this.DialogResult = DialogResult.OK;
        }
        //Känenr av lägesändringsradioknappar, och ändrar läge efter dem.
        private void radioButton_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rb = sender as RadioButton;
            if (rbtn_Row.Checked)
            {
                _onRow = true;
                setTaskInfo();
            }
            if (rbtn_fileOrTask.Checked)
            {
                _onRow = false;
                TextEditor.Text = "";
                TextEditor.Refresh();
            }
            UpdateVisible();
        }
        //Ändrar läge mellan rad och uppgift/fil
        private void UpdateVisible()
        {
            if (!_onRow)
            {
                lbox_selection.Visible = true;
                panelInfo.Visible = false;
            }
            else
            {
                lbox_selection.Visible = false;
                panelInfo.Visible = true;
            }
        }
        //Fyller listboxen, samt en tooltiparray, sätter en text för hela uppgiften innan alla filerna.
        private void FillListBox()
        {
            Tabell<string> _Dokument = new Tabell<string>(Myskul.Command("SELECT sf.filename,sf.filenameHash,sf.id FROM submit_file AS sf JOIN submit AS s ON (s.id=sf.submitId) WHERE s.id ='" + Convert.ToString(SavedData.currentTask.getId()) + "';"));
            string UppgiftNamn = new Tabell<string>(Myskul.Command("SELECT t.name FROM task as t JOIN submit as su ON (t.id=su.taskid) WHERE su.id='"+ _submitId + "';"))[0,0];
            _fileIds = _Dokument.getColumn(2);
            List<string> temp = _Dokument.getColumn(0);
            temp.Insert(0,"Hela " + UppgiftNamn);
            foreach (string x in temp)
            {
                if (x.Length > 14)
                    lbox_selection.Items.Add(x.Remove(12) + "..");
                else
                    lbox_selection.Items.Add(x);
                this._arrItemToolTips.Add(x);
            }
            lbox_selection.SelectedIndex = 0;
        }
        //Sätter info då man ska komemtnera en specifik rad, såsom rader, markerad text, filnamn mm.
        private void setTaskInfo()
        {
            TruncateAdd truncate = new TruncateAdd(lblToolTip);
            truncate.addTextAndToolTip(lbl_documentName,new Tabell<string>(Myskul.Command("SELECT filename FROM submit_file WHERE id='"+ _fileId +"';"))[0,0],20);
            truncate.addTextAndToolTip(lbl_taskName, new Tabell<string>(Myskul.Command("SELECT t.name FROM task as t JOIN submit as su ON (t.id=su.taskid) WHERE su.id='" + _submitId + "';"))[0, 0],20);
            if (_startRowIndex == _endRowIndex)
                truncate.addTextAndToolTip(lbl_row,_startRowIndex,20);
            else
                truncate.addTextAndToolTip(lbl_row,_startRowIndex + " till " + _endRowIndex,20);
            TextEditor.Text = "[Elevens kod]\n" + _selectedIndexText + "\n[/Elevens kod]\n";
        }
        //initierar text-editorn ICSharp texteditor.
        private void InitializeTextEditor()
        {
            string dir = Application.StartupPath;
            FileSyntaxModeProvider fsmp;
            if (Directory.Exists(dir))
            {
                fsmp = new FileSyntaxModeProvider(dir);
                HighlightingManager.Manager.AddSyntaxModeFileProvider(fsmp);
                TextEditor.SetHighlighting("C#");
            }
        }
        //Känenr av då man byter mål i listboxen, och ändrar på _fileId efter vald fil.
        private void lbox_selection_SelectedIndexChanged(object sender, EventArgs e)
        {
            ListBox temp = (ListBox)sender;
            if (lbox_selection.SelectedIndex > 0)
                _fileId = _fileIds[temp.SelectedIndex-1];
        }
        //Ändrar tooltip på listboxen beroende på vilket element som hovras, för att visa rätt tooltip.
        private void lbox_selection_MouseMove(object sender, MouseEventArgs e)
        {
            ListBox listBox = (ListBox)sender;
            int index = listBox.IndexFromPoint(e.Location);
            if (index > -1 && index < listBox.Items.Count)
            {

                string tip = this._arrItemToolTips[index];
                if (tip != lastTip)
                {
                    ListToolTip.SetToolTip(listBox, tip);
                    lastTip = tip;
                }
            }
        }
    }
}
